home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 34 / Mac Magazin and MacEasy Magazine CD - Issue 34.iso / Grafik & Text / Alpha ƒ / Tcl / Modes / htmlMenu.tcl < prev    next >
Text File  |  1997-03-04  |  58KB  |  1,522 lines

  1. #=============================================================================
  2. #    
  3. #    htmlMenu.tcl  (called from html.tcl)
  4. #
  5. #    Part of HTML mode 1.4.1
  6. #
  7. #    HTML elements definitions and HTML menu.
  8. #
  9. #    Copyright 1996, 1997 by Johan Linde <jl@theophys.kth.se>.
  10. #    This software may be used freely, and distributed freely, as long as 
  11. #    the receiver is not obligated in any way by receiving it.
  12. #
  13. #    If you make improvements to this file, please share them!
  14. #
  15. #=============================================================================
  16. #
  17.  
  18. # Loading of package.
  19. proc htmlLoadPackage {level} {
  20.     global htmlPackageToUse
  21.     global HTMLmodeVars modifiedModeVars
  22.  
  23.     if {$level != $htmlPackageToUse} {    
  24.         set HTMLmodeVars(htmlPackageToUse) $level
  25.         lappend modifiedModeVars {htmlPackageToUse HTMLmodeVars}
  26.         message "Rebuilding HTML menu…"
  27.         htmlBuildMenu
  28.         htmlUnbindKeys
  29.         message "Done."
  30.     }
  31. }
  32.  
  33. proc htmlToggleBrother {} {
  34.     global HTMLmodeVars modifiedModeVars
  35.     set HTMLmodeVars(useBigBrother) [expr !$HTMLmodeVars(useBigBrother)]
  36.     if {[catch {nameFromAppl Bbth}]} {
  37.         set HTMLmodeVars(useBigBrother) 0
  38.         enableMenuItem {Check Links} {Use Big Brother} off
  39.     }
  40.     markMenuItem -m {Check Links} {Use Big Brother} $HTMLmodeVars(useBigBrother) 
  41.     lappend modifiedModeVars {useBigBrother HTMLmodeVars}
  42. }
  43.  
  44. # Called from HTML menu to change browser.
  45. proc htmlToggleBrowser {brws} {
  46.     global htmlBrowsers browserSig modifiedVars
  47.     foreach b $htmlBrowsers {
  48.         if {$brws == [lindex $b 1]} {set browserSig [lindex $b 0]}
  49.     }
  50.     lappend modifiedVars browserSig
  51. }
  52.  
  53. # Called whenever browserSig is changed.
  54. proc htmlToggleBrowser2 {dum1 dum2 dum3} {
  55.     global browserSig htmlBrowsers HTMLmodeVars
  56.     if {[lsearch -exact $HTMLmodeVars(browsers) $browserSig] < 0} {htmlAddBrowser $browserSig}
  57.     foreach b $htmlBrowsers {
  58.         if {$browserSig == [lindex $b 0]} {
  59.             markMenuItem -m Browsers [lindex $b 1] on 
  60.         } else {
  61.             markMenuItem -m Browsers [lindex $b 1] off
  62.         }
  63.     }
  64. }
  65.  
  66. # Add a browser to Browser menu.
  67. proc htmlAddBrowser {{sig ""}} {
  68.     global htmlBrowsers HTMLmodeVars modifiedModeVars
  69.     if {$sig == ""} {
  70.         set fil [getfile "Locate a web browser."]
  71.         set sig [getFileSig $fil]
  72.     }
  73.     if {[catch {nameFromAppl $sig} fil]} {
  74.         alertnote "Couldn't get the name of the browser. If nothing else helps try rebuilding the desktop."
  75.         return
  76.     }
  77.     if {[lsearch -exact $HTMLmodeVars(browsers) $sig] >= 0} {return}
  78.     lappend HTMLmodeVars(browsers) $sig
  79.     lappend modifiedModeVars {browsers HTMLmodeVars}
  80.     lappend htmlBrowsers [list $sig [file tail $fil]]
  81.     addMenuItem -m Browsers [file tail $fil]
  82. }
  83.  
  84. # Remove a browser from Browser menu.
  85. proc htmlRemoveBrowser {} {
  86.     global htmlBrowsers HTMLmodeVars modifiedModeVars browserSig modifiedVars
  87.     foreach b $htmlBrowsers {
  88.         lappend tmp [lindex $b 1]
  89.     }
  90.     if {[catch {listpick -p "Select browser to remove" $tmp} brws] || $brws == ""} {return}
  91.     for {set i 0} {$i < [llength $htmlBrowsers]} {incr i} {
  92.         if {$brws == [lindex [lindex $htmlBrowsers $i] 1]} {
  93.             deleteMenuItem -m Browsers $brws
  94.             if {[lindex $HTMLmodeVars(browsers) $i] == $browserSig} {
  95.                 set j 0
  96.                 if {$i == 0} {incr j}
  97.                 if {$j < [llength $HTMLmodeVars(browsers)]} {set browserSig [lindex $HTMLmodeVars(browsers) $j]}
  98.                 lappend modifiedVars browserSig
  99.             }
  100.             set htmlBrowsers [lreplace $htmlBrowsers $i $i]
  101.             set HTMLmodeVars(browsers) [lreplace $HTMLmodeVars(browsers) $i $i] 
  102.         }
  103.     }
  104.     lappend modifiedModeVars {browsers HTMLmodeVars}
  105. }
  106.  
  107. proc htmlEnableURLs {onoff} {
  108.     enableMenuItem URLs "Clean Up…" $onoff
  109.     enableMenuItem URLs "Clear" $onoff
  110.     enableMenuItem URLs "Export…" $onoff
  111. }
  112.  
  113. proc htmlEnablewindows {onoff} {
  114.     enableMenuItem "HTML Utilities" Windows $onoff
  115. }
  116.  
  117. proc htmlEnableExtend {a b} {
  118.     enableMenuItem Extend "Change Key Binding" $a
  119.     enableMenuItem Extend "Change Type and Layout" $a
  120.     enableMenuItem Extend "Remove Attributes" $b
  121.     enableMenuItem Extend "Remove Additions" $b
  122. }
  123.  
  124.  
  125. # This proc is not used any more. It now gives a warning message if the user
  126. # call it to define new elements in HTMLprefs.tcl.
  127. proc htmlNewElemVar {{list ""} {var ""} {val ""}} {
  128.     global htmlShownWarning
  129.     if {![info exists htmlShownWarning]} {
  130.         beep
  131.         dialog -w 350 -h 290 -t "The way to add custom elements to HTML mode has changed."\
  132.         10 10 340 45 \
  133.         -t "New elements can now be added with the functions found in the submenu HTML Utilities\
  134.         -> Extend in the HTML menu. However, this submenu is disabled until you remove all\
  135.         your definitions of custom elements from HTMLPrefs.tcl and restart Alpha."\
  136.         10 55 340 150\
  137.         -t "Select 'Help' from the HTML menu and then select 'Extending HTML mode' from the\
  138.         marks menu in the help file to read more about how to avoid this message and how\
  139.         to add new elements to HTML mode." 10 160 340 250\
  140.         -b OK 20 260 85 280
  141.         set htmlShownWarning 1
  142.         enableMenuItem "HTML Utilities" Extend off
  143.     }
  144. }
  145.  
  146. proc htmlSetAttrUsed {num elem used} {
  147.     global htmlElemAttrUsed htmlElemAttrUsed3
  148.     if {![info exists htmlElemAttrUsed${num}($elem)]} {set htmlElemAttrUsed${num}($elem) $used}
  149. }
  150.  
  151. #
  152. # htmlElemAttrRequired: the per-element lists of all required attributes
  153. # htmlElemAttrOptional: the per-element lists of all optional attributes
  154. # htmlElemAttrChoices: element-specific attribute completions
  155. # htmlElemAttrNumber: the per-element list of attributes which are numbers.
  156. # htmlElemEventHandler: the per-element list of JavaScript's event handlers.
  157. # htmlElemAttrUsed: the per-element list of elements asked for in the status bar.
  158. #
  159. # htmlElemAttrOptional has to be defined for every element for everything
  160. # to work.
  161.  
  162. #=============================================================================
  163. #
  164. #     Extensions
  165. #
  166. #=============================================================================
  167.  
  168. proc htmlExtensions {} {
  169.     global htmlElemAttrRequired1 htmlElemAttrOptional1 htmlPlugins
  170.     global htmlElemEventHandler1 htmlElemAttrChoices1 htmlElemAttrNumber1
  171.     
  172.     set htmlElemAttrOptional1(HTML) {}
  173.     set htmlElemAttrOptional1(HEAD) {}
  174.     set htmlElemAttrOptional1(TITLE) {}
  175.     set htmlElemAttrOptional1(BODY)    {BACKGROUND= BGCOLOR= TEXT= LINK= VLINK= ALINK=}
  176.     set htmlElemEventHandler1(BODY)    {onLoad= onUnload=}
  177.     htmlSetAttrUsed ""     BODY {BACKGROUND= BGCOLOR= TEXT= LINK= VLINK=}
  178.     
  179.     set htmlElemAttrOptional1(H1)    {ALIGN= }
  180.     set htmlElemAttrChoices1(H1)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  181.     htmlSetAttrUsed ""     H1    {ALIGN=}
  182.     set htmlElemAttrOptional1(H2)    {ALIGN= }
  183.     set htmlElemAttrChoices1(H2)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  184.     htmlSetAttrUsed ""     H2    {ALIGN=}
  185.     set htmlElemAttrOptional1(H3)    {ALIGN= }
  186.     set htmlElemAttrChoices1(H3)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  187.     htmlSetAttrUsed ""     H3    {ALIGN=}
  188.     set htmlElemAttrOptional1(H4)    {ALIGN= }
  189.     set htmlElemAttrChoices1(H4)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  190.     htmlSetAttrUsed ""     H4    {ALIGN=}
  191.     set htmlElemAttrOptional1(H5)    {ALIGN= }
  192.     set htmlElemAttrChoices1(H5)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  193.     htmlSetAttrUsed ""     H5    {ALIGN=}
  194.     set htmlElemAttrOptional1(H6)    {ALIGN= }
  195.     set htmlElemAttrChoices1(H6)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  196.     htmlSetAttrUsed ""     H6    {ALIGN=}
  197.     
  198.     set htmlElemAttrOptional1(P)    {ALIGN= }
  199.     set htmlElemAttrChoices1(P)        {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  200.     htmlSetAttrUsed ""     P    {ALIGN=}
  201.     set htmlElemAttrOptional1(BLOCKQUOTE) {}
  202.     set htmlElemAttrOptional1(DIV)    {ALIGN= }
  203.     set htmlElemAttrChoices1(DIV)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  204.     htmlSetAttrUsed ""        DIV    {ALIGN=}
  205.     set htmlElemAttrOptional1(ADDRESS) {}
  206.     set htmlElemAttrOptional1(CENTER) {}
  207.     set htmlElemAttrOptional1(PRE)    {WIDTH= }
  208.     set htmlElemAttrNumber1(PRE)     {WIDTH=1:i:n}
  209.     set htmlElemAttrRequired1(MULTICOL)    {COLS=}
  210.     set htmlElemAttrOptional1(MULTICOL)    {GUTTER= WIDTH=}
  211.     set htmlElemAttrNumber1(MULTICOL)    {COLS=2:i:n GUTTER=0:i:n WIDTH=1:i:%}
  212.     htmlSetAttrUsed "" MULTICOL {COLS= GUTTER= WIDTH=}
  213.     set htmlElemAttrRequired1(SPACER)    {TYPE=}
  214.     set htmlElemAttrOptional1(SPACER)    {SIZE= WIDTH= HEIGHT= ALIGN=}
  215.     set htmlElemAttrNumber1(SPACER)    {SIZE=1:i:n WIDTH=1:i:% HEIGHT=1:i:%}
  216.     set htmlElemAttrChoices1(SPACER) {TYPE=HORIZONTAL TYPE=VERTICAL TYPE=BLOCK ALIGN=TOP 
  217.     ALIGN=MIDDLE ALIGN=BOTTOM ALIGN=LEFT ALIGN=RIGHT ALIGN=TEXTTOP ALIGN=ABSMIDDLE ALIGN=BASELINE}
  218.     htmlSetAttrUsed "" SPACER {TYPE= SIZE= WIDTH= HEIGHT= ALIGN=}
  219.     set htmlElemAttrOptional1(BR)    {CLEAR= }
  220.     set htmlElemAttrChoices1(BR)    {CLEAR=ALL CLEAR=LEFT CLEAR=RIGHT CLEAR=NONE}
  221.     set htmlElemAttrOptional1(HR)    {ALIGN= SIZE= WIDTH= NOSHADE}
  222.     set htmlElemAttrChoices1(HR)    {ALIGN=LEFT ALIGN=RIGHT ALIGN=CENTER}
  223.     set htmlElemAttrNumber1(HR)     {SIZE=1:i:n WIDTH=1:i:%}
  224.     set htmlElemAttrOptional1(NOBR) {}
  225.     set htmlElemAttrOptional1(WBR)     {}
  226.     
  227.     set htmlElemAttrOptional1(FONT)    {SIZE= COLOR= FACE=}
  228.     set htmlElemAttrNumber1(FONT)    {SIZE=1:7:n}
  229.     htmlSetAttrUsed ""        FONT    {SIZE=}
  230.     set htmlElemAttrRequired1(BASEFONT)    {SIZE=}
  231.     set htmlElemAttrOptional1(BASEFONT) {}
  232.     set htmlElemAttrNumber1(BASEFONT)    {SIZE=1:7:n}
  233.     set htmlElemAttrOptional1(B) {}
  234.     set htmlElemAttrOptional1(I) {}
  235.     set htmlElemAttrOptional1(STRIKE) {}
  236.     set htmlElemAttrOptional1(U) {}
  237.     set htmlElemAttrOptional1(SUB) {}
  238.     set htmlElemAttrOptional1(SUP) {}
  239.     set htmlElemAttrOptional1(BIG) {}
  240.     set htmlElemAttrOptional1(SMALL) {}
  241.     set htmlElemAttrOptional1(EM) {}
  242.     set htmlElemAttrOptional1(STRONG) {}
  243.     set htmlElemAttrOptional1(DFN) {}
  244.     set htmlElemAttrOptional1(CODE) {}
  245.     set htmlElemAttrOptional1(VAR) {}
  246.     set htmlElemAttrOptional1(CITE) {}
  247.     set htmlElemAttrOptional1(KBD) {}
  248.     set htmlElemAttrOptional1(TT) {}
  249.     set htmlElemAttrOptional1(SAMP) {}
  250.     set htmlElemAttrOptional1(BLINK) {}
  251.     
  252.     set htmlElemAttrOptional1(A)    {HREF= NAME= TARGET= REL= REV=  TITLE= }
  253.     set htmlElemEventHandler1(A)    {onClick= onMouseOver= onMouseOut=}
  254.     htmlSetAttrUsed ""        A    {HREF= NAME=}
  255.     set htmlElemAttrRequired1(IMG)    {SRC=}
  256.     set htmlElemAttrOptional1(IMG)    {LOWSRC= WIDTH= HEIGHT=  BORDER= 
  257.     ALIGN= ALT= HSPACE= VSPACE= USEMAP= ISMAP}
  258.     set htmlElemAttrChoices1(IMG)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  259.     ALIGN=LEFT ALIGN=RIGHT ALIGN=TEXTTOP ALIGN=ABSMIDDLE ALIGN=BASELINE}
  260.     set htmlElemAttrNumber1(IMG) {BORDER=0:i:n WIDTH=1:i:% HEIGHT=1:i:%
  261.     HSPACE=0:i:n VSPACE=0:i:n}
  262.     set htmlElemEventHandler1(IMG)    {onAbort= onError= onLoad=}
  263.     htmlSetAttrUsed ""        IMG    {SRC= WIDTH= HEIGHT= ALIGN= ALT=}
  264.     
  265.     set htmlElemAttrRequired1(EMBED)    {SRC= WIDTH= HEIGHT=}
  266.     set htmlElemAttrOptional1(EMBED)    {HSPACE= VSPACE= ALIGN=}
  267.     set htmlElemAttrNumber1(EMBED) {WIDTH=1:i:n HEIGHT=1:i:n HSPACE=1:i:n VSPACE=1:i:n}
  268.     set htmlElemAttrChoices1(EMBED)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  269.     ALIGN=LEFT ALIGN=RIGHT ALIGN=TEXTTOP ALIGN=ABSMIDDLE ALIGN=BASELINE}
  270.     set htmlElemAttrOptional1(NOEMBED) {}
  271.     set htmlElemAttrRequired1(LIVEAUDIO) {SRC= WIDTH= HEIGHT=}
  272.     set htmlElemAttrOptional1(LIVEAUDIO)    {HSPACE= VSPACE= ALIGN= AUTOSTART= LOOP=}
  273.     set htmlElemAttrNumber1(LIVEAUDIO) {WIDTH=1:i:n HEIGHT=1:i:n HSPACE=1:i:n VSPACE=1:i:n}
  274.     set htmlElemAttrChoices1(LIVEAUDIO)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  275.     ALIGN=LEFT ALIGN=RIGHT ALIGN=TEXTTOP ALIGN=ABSMIDDLE ALIGN=BASELINE 
  276.     AUTOSTART=TRUE AUTOSTART=FALSE LOOP=TRUE LOOP=FALSE}
  277.     htmlSetAttrUsed "" LIVEAUDIO {SRC= WIDTH= HEIGHT= AUTOSTART= LOOP=}
  278.     set htmlElemAttrRequired1(LIVEVIDEO) {SRC= WIDTH= HEIGHT=}
  279.     set htmlElemAttrOptional1(LIVEVIDEO)    {HSPACE= VSPACE= ALIGN= AUTOSTART= LOOP= CONTROLS=}
  280.     set htmlElemAttrNumber1(LIVEVIDEO) {WIDTH=1:i:n HEIGHT=1:i:n HSPACE=1:i:n VSPACE=1:i:n}
  281.     set htmlElemAttrChoices1(LIVEVIDEO)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  282.     ALIGN=LEFT ALIGN=RIGHT ALIGN=TEXTTOP ALIGN=ABSMIDDLE ALIGN=BASELINE 
  283.     AUTOSTART=TRUE AUTOSTART=FALSE LOOP=TRUE LOOP=FALSE CONTROLS=TRUE CONTROLS=FALSE}
  284.     htmlSetAttrUsed "" LIVEVIDEO {SRC= WIDTH= HEIGHT= AUTOSTART= LOOP= CONTROLS=}
  285.     set htmlElemAttrRequired1([list QUICKTIME MOVIE])    {SRC= }
  286.     set htmlElemAttrOptional1([list QUICKTIME MOVIE])    {WIDTH= HEIGHT= HSPACE= VSPACE= ALIGN=
  287.     HIDDEN= AUTOPLAY= CONTROLLER= LOOP= PLAYEVERYFRAME= HREF= TARGET= PLUGINSPAGE=}
  288.     set htmlElemAttrNumber1([list QUICKTIME MOVIE]) {WIDTH=1:i:n HEIGHT=1:i:n HSPACE=1:i:n VSPACE=1:i:n}
  289.     set htmlElemAttrChoices1([list QUICKTIME MOVIE])    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  290.     ALIGN=LEFT ALIGN=RIGHT ALIGN=TEXTTOP ALIGN=ABSMIDDLE ALIGN=BASELINE HIDDEN=TRUE HIDDEN=FALSE
  291.     AUTOPLAY=TRUE AUTOPLAY=FALSE CONTROLLER=TRUE CONTROLLER=FALSE LOOP=TRUE LOOP=FALSE 
  292.     LOOP=PALINDROME PLAYEVERYFRAME=TRUE PLAYEVERYFRAME=FALSE}
  293.     htmlSetAttrUsed "" "QUICKTIME MOVIE" {SRC= WIDTH= HEIGHT= HIDDEN= AUTOPLAY= CONTROLLER= LOOP= 
  294.     PLAYEVERYFRAME=}
  295.     set htmlElemAttrRequired1([list QUICKTIME VR])    {SRC= WIDTH= HEIGHT=}
  296.     set htmlElemAttrOptional1([list QUICKTIME VR])    {HSPACE= VSPACE= ALIGN= PAN= TILT= FOV=
  297.     NODE= CORRECTION= PLUGINSPAGE=}
  298.     set htmlElemAttrNumber1([list QUICKTIME VR]) {WIDTH=1:i:n HEIGHT=1:i:n 
  299.     HSPACE=1:i:n VSPACE=1:i:n PAN=0:360:n TILT=-360:360:n FOV=-360:360:n NODE=0:i:n}
  300.     set htmlElemAttrChoices1([list QUICKTIME VR])    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  301.     ALIGN=LEFT ALIGN=RIGHT ALIGN=TEXTTOP ALIGN=ABSMIDDLE ALIGN=BASELINE
  302.     CORRECTION=NONE CORRECTION=PARTIAL CORRECTION=FULL}
  303.     htmlSetAttrUsed "" "QUICKTIME VR" {SRC= WIDTH= HEIGHT= PAN= TILT= FOV=
  304.     NODE= CORRECTION=}
  305.     set htmlElemAttrRequired1(REALAUDIO)    {SRC= WIDTH= HEIGHT=}
  306.     set htmlElemAttrOptional1(REALAUDIO)    {HSPACE= VSPACE= ALIGN= CONTROLS= AUTOSTART=
  307.     NOLABELS= CONSOLE=}
  308.     set htmlElemAttrNumber1(REALAUDIO) {WIDTH=1:i:n HEIGHT=1:i:n HSPACE=1:i:n VSPACE=1:i:n}
  309.     set htmlElemAttrChoices1(REALAUDIO)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  310.     ALIGN=LEFT ALIGN=RIGHT ALIGN=TEXTTOP ALIGN=ABSMIDDLE ALIGN=BASELINE
  311.     CONTROLS=ALL CONTROLS=CONTROLPANEL CONTROLS=INFOVOLUMEPANEL CONTROLS=INFOPANEL
  312.     CONTROLS=STATUSBAR CONTROLS=PLAYBUTTON CONTROLS=STOPBUTTON CONTROLS=VOLUMESLIDER
  313.     CONTROLS=POSITIONSLIDER CONTROLS=POSITIONFIELD CONTROLS=STATUSFIELD
  314.     AUTOSTART=TRUE AUTOSTART=FALSE NOLABELS=TRUE NOLABELS=FALSE}
  315.     htmlSetAttrUsed "" REALAUDIO {SRC= WIDTH= HEIGHT= CONTROLS= AUTOSTART=
  316.     NOLABELS= CONSOLE=}
  317.         
  318.     set htmlElemAttrOptional1(UL)    {TYPE= COMPACT}
  319.     set htmlElemAttrChoices1(UL)    {TYPE=DISC TYPE=CIRCLE TYPE=SQUARE}
  320.     set htmlElemAttrOptional1([list LI IN UL])    {TYPE=}
  321.     set htmlElemAttrChoices1([list LI IN UL])    {TYPE=DISC TYPE=CIRCLE TYPE=SQUARE}
  322.     set htmlElemAttrOptional1(OL)    {TYPE= START= COMPACT}
  323.     set htmlElemAttrChoices1(OL)    {TYPE=A TYPE=a TYPE=I TYPE=i TYPE=1}
  324.     set htmlElemAttrNumber1(OL)    {START=1:i:n}
  325.     set htmlElemAttrOptional1([list LI IN OL])    {TYPE= VALUE=}
  326.     set htmlElemAttrNumber1([list LI IN OL])    {VALUE=1:i:n}
  327.     set htmlElemAttrChoices1([list LI IN OL])    {TYPE=A TYPE=a TYPE=I TYPE=i TYPE=1}
  328.     set htmlElemAttrOptional1(DIR) {COMPACT}
  329.     set htmlElemAttrOptional1(MENU) {COMPACT}
  330.     set htmlElemAttrOptional1(LI) {}
  331.     set htmlElemAttrOptional1(DL) {COMPACT}
  332.     set htmlElemAttrOptional1(DT) {}
  333.     set htmlElemAttrOptional1(DD)    {}
  334.     
  335.     set htmlElemAttrOptional1(FORM)    {ACTION= METHOD= ENCTYPE= TARGET= NAME=}
  336.     set htmlElemAttrChoices1(FORM)    {METHOD=POST METHOD=GET}
  337.     set htmlElemEventHandler1(FORM)    {onReset= onSubmit=}
  338.     htmlSetAttrUsed ""        FORM    {ACTION= METHOD= }
  339.     set htmlElemAttrRequired1(TEXT)    {NAME=}
  340.     set htmlElemAttrOptional1(TEXT)    {VALUE= SIZE= MAXLENGTH=}
  341.     set htmlElemAttrNumber1(TEXT)    {SIZE=1:i:n MAXLENGTH=1:i:n}
  342.     set htmlElemEventHandler1(TEXT)    {onBlur= onChange= onFocus= onSelect=}
  343.     htmlSetAttrUsed ""     TEXT    {NAME= VALUE= SIZE= MAXLENGTH=}
  344.     set htmlElemAttrRequired1(CHECKBOX)    {NAME= VALUE=}
  345.     set htmlElemAttrOptional1(CHECKBOX)    {CHECKED}
  346.     set htmlElemEventHandler1(CHECKBOX)    {onClick=}
  347.     htmlSetAttrUsed ""     CHECKBOX    {NAME= VALUE= CHECKED}
  348.     set htmlElemAttrRequired1(BUTTON)    {VALUE=}
  349.     set htmlElemAttrOptional1(BUTTON)    {NAME=}
  350.     set htmlElemEventHandler1(BUTTON)    {onClick=}
  351.     htmlSetAttrUsed ""     BUTTON    {VALUE= NAME=}
  352.     set htmlElemAttrRequired1(RADIO)    {NAME= VALUE=}
  353.     set htmlElemAttrOptional1(RADIO)    {CHECKED}
  354.     set htmlElemEventHandler1(RADIO)    {onClick=}
  355.     htmlSetAttrUsed ""     RADIO    {NAME= VALUE= CHECKED}
  356.     set htmlElemAttrOptional1(SUBMIT)    {NAME= VALUE=}
  357.     set htmlElemEventHandler1(SUBMIT)    {onClick=}
  358.     htmlSetAttrUsed ""     SUBMIT    {VALUE= }
  359.     set htmlElemAttrOptional1(RESET)    {VALUE= }
  360.     set htmlElemEventHandler1(RESET)    {onClick=}
  361.     htmlSetAttrUsed ""     RESET    {VALUE= }
  362.     set htmlElemAttrRequired1(PASSWORD)    {NAME= }
  363.     set htmlElemAttrOptional1(PASSWORD)    {VALUE= SIZE= MAXLENGTH=}
  364.     set htmlElemAttrNumber1(PASSWORD)    {SIZE=1:i:n MAXLENGTH=1:i:n}
  365.     htmlSetAttrUsed ""     PASSWORD    {NAME= VALUE= SIZE= MAXLENGTH=}
  366.     set htmlElemAttrRequired1(HIDDEN)    {NAME= VALUE=}
  367.     set htmlElemAttrOptional1(HIDDEN)    {}
  368.     set htmlElemAttrRequired1(IMAGE)    {NAME= SRC=}
  369.     set htmlElemAttrOptional1(IMAGE)    {ALIGN=}
  370.     set htmlElemAttrChoices1(IMAGE)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  371.     ALIGN=LEFT ALIGN=RIGHT}
  372.     set htmlElemAttrRequired1(FILE)    {NAME= }
  373.     set htmlElemAttrOptional1(FILE)    {SIZE= MAXLENGTH=}
  374.     set htmlElemAttrNumber1(FILE)    {SIZE=1:i:n MAXLENGTH=1:i:n}
  375.     set htmlElemAttrRequired1(SELECT)    {NAME= }
  376.     set htmlElemAttrOptional1(SELECT)    {SIZE= MULTIPLE}
  377.     set htmlElemAttrNumber1(SELECT)    {SIZE=1:i:n}
  378.     set htmlElemEventHandler1(SELECT)    {onBlur= onChange= onFocus=}
  379.     htmlSetAttrUsed ""        SELECT    {NAME= SIZE= MULTIPLE}
  380.     set htmlElemAttrOptional1(OPTION)    {VALUE= SELECTED}
  381.     htmlSetAttrUsed ""        OPTION    {SELECTED}
  382.     set htmlElemAttrRequired1(TEXTAREA)    {NAME= ROWS= COLS=}
  383.     set htmlElemAttrOptional1(TEXTAREA)    {WRAP=}
  384.     set htmlElemAttrNumber1(TEXTAREA)    {ROWS=1:i:n COLS=1:i:n}
  385.     set htmlElemAttrChoices1(TEXTAREA) {WRAP=VIRTUAL WRAP=PHYSICAL WRAP=OFF}
  386.     set htmlElemEventHandler1(TEXTAREA)    {onBlur= onChange= onFocus= onSelect=}
  387.     
  388.     set htmlElemAttrOptional1(TABLE)    {BORDER= CELLSPACING= CELLPADDING= WIDTH= HEIGHT=
  389.     ALIGN= BGCOLOR=}
  390.     set htmlElemAttrChoices1(TABLE)    {ALIGN=LEFT ALIGN=CENTER ALIGN=RIGHT}
  391.     set htmlElemAttrNumber1(TABLE)    {BORDER=0:i:n CELLSPACING=0:i:n 
  392.     CELLPADDING=0:i:n WIDTH=1:i:% HEIGHT=1:i:%}
  393.     htmlSetAttrUsed ""     TABLE    {BORDER= CELLSPACING= CELLPADDING=}
  394.     set htmlElemAttrOptional1(TD)    {ALIGN= VALIGN= COLSPAN= ROWSPAN= WIDTH= HEIGHT= NOWRAP
  395.     BGCOLOR=}
  396.     set htmlElemAttrChoices1(TD)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT 
  397.     VALIGN=BASELINE VALIGN=BOTTOM VALIGN=MIDDLE VALIGN=TOP }
  398.     set htmlElemAttrNumber1(TD)    {COLSPAN=1:i:n ROWSPAN=1:i:n WIDTH=1:i:% HEIGHT=1:i:n}
  399.     htmlSetAttrUsed ""     TD    {ALIGN= VALIGN= COLSPAN= ROWSPAN= NOWRAP}
  400.     set htmlElemAttrOptional1(TH)    {ALIGN= VALIGN= COLSPAN= ROWSPAN= WIDTH= HEIGHT= NOWRAP
  401.     BGCOLOR=}
  402.     set htmlElemAttrChoices1(TH)    {ALIGN=LEFT ALIGN=CENTER ALIGN=RIGHT 
  403.     VALIGN=BASELINE VALIGN=BOTTOM VALIGN=MIDDLE VALIGN=TOP }
  404.     set htmlElemAttrNumber1(TH)    {COLSPAN=1:i:n ROWSPAN=1:i:n WIDTH=1:i:% HEIGHT=1:i:n}
  405.     htmlSetAttrUsed ""     TH    {ALIGN= VALIGN= COLSPAN= ROWSPAN= NOWRAP }
  406.     set htmlElemAttrOptional1(TR)    {ALIGN= VALIGN= BGCOLOR=}
  407.     set htmlElemAttrChoices1(TR)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT  
  408.     VALIGN=BASELINE VALIGN=BOTTOM VALIGN=MIDDLE VALIGN=TOP }
  409.     htmlSetAttrUsed ""        TR    {ALIGN= VALIGN=}
  410.     set htmlElemAttrOptional1(CAPTION)    {ALIGN=}
  411.     set htmlElemAttrChoices1(CAPTION)    {ALIGN=BOTTOM ALIGN=TOP }
  412.     htmlSetAttrUsed ""     CAPTION    {ALIGN=}
  413.     
  414.     set htmlElemAttrOptional1(FRAMESET) {ROWS= COLS= FRAMEBORDER= BORDER= BORDERCOLOR=}
  415.     set htmlElemAttrNumber1(FRAMESET)    {BORDER=0:i:n}
  416.     set htmlElemAttrChoices1(FRAMESET)    {FRAMEBORDER=YES FRAMEBORDER=NO}
  417.     set htmlElemEventHandler1(FRAMESET)    {onLoad= onUnload=}
  418.     htmlSetAttrUsed ""        FRAMESET {ROWS= COLS=}
  419.     set htmlElemAttrRequired1(FRAME)    {SRC=}
  420.     set htmlElemAttrOptional1(FRAME)    {NAME= MARGINWIDTH= MARGINHEIGHT= SCROLLING=
  421.     NORESIZE FRAMEBORDER= BORDERCOLOR=}
  422.     set htmlElemAttrChoices1(FRAME)    {SCROLLING=YES SCROLLING=NO SCROLLING=AUTO 
  423.     FRAMEBORDER=YES FRAMEBORDER=NO}
  424.     set htmlElemAttrNumber1(FRAME)    {MARGINWIDTH=1:i:n MARGINHEIGHT=1:i:n}
  425.     htmlSetAttrUsed ""        FRAME    {SRC= NAME= }
  426.     set htmlElemAttrOptional1(NOFRAMES) {}
  427.     
  428.     set htmlElemAttrRequired1(MAP)        {NAME=}
  429.     set htmlElemAttrOptional1(MAP)        {}
  430.     set htmlElemAttrRequired1(AREA) {ALT=}
  431.     set htmlElemAttrOptional1(AREA)    {SHAPE= COORDS= TARGET= HREF= NOHREF}
  432.     set htmlElemAttrChoices1(AREA)    {SHAPE=RECT SHAPE=CIRCLE SHAPE=POLY
  433.     SHAPE=DEFAULT}
  434.     set htmlElemEventHandler1(AREA)    {onClick= onMouseOver= onMouseOut=}
  435.     htmlSetAttrUsed ""        AREA    {SHAPE= COORDS= HREF= NOHREF}
  436.     
  437.     set htmlElemAttrRequired1(APPLET)    {CODE= WIDTH= HEIGHT=}
  438.     set htmlElemAttrOptional1(APPLET)     {CODEBASE= ARCHIVE= HSPACE= VSPACE= ALIGN= NAME= ALT=
  439.     MAYSCRIPT}
  440.     set htmlElemAttrChoices1(APPLET)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  441.     ALIGN=LEFT ALIGN=RIGHT ALIGN=TEXTTOP ALIGN=ABSMIDDLE
  442.     ALIGN=BASELINE}
  443.     set htmlElemAttrNumber1(APPLET)     {VSPACE=0:i:n HSPACE=0:i:n WIDTH=1:i:n
  444.     HEIGHT=1:i:n}
  445.     htmlSetAttrUsed ""        APPLET    {CODE= WIDTH= HEIGHT= CODEBASE= ALIGN= }
  446.     set htmlElemAttrRequired1(PARAM)    {NAME= VALUE=}
  447.     set htmlElemAttrOptional1(PARAM)    {}
  448.     set htmlElemAttrOptional1(SCRIPT)    {LANGUAGE= SRC=}
  449.     set htmlElemAttrChoices1(SCRIPT)    {LANGUAGE=JAVASCRIPT}
  450.     htmlSetAttrUsed ""        SCRIPT    {LANGUAGE=}
  451.     set htmlElemAttrOptional1(NOSCRIPT) {}
  452.     
  453.     set htmlElemAttrOptional1(BASE)    {HREF= TARGET=}
  454.     htmlSetAttrUsed ""        BASE    {HREF= }
  455.     set htmlElemAttrOptional1(ISINDEX)    {ACTION= PROMPT=}
  456.     set htmlElemAttrOptional1(LINK)    {HREF=  REL= REV= TITLE=}
  457.     htmlSetAttrUsed ""        LINK    {HREF=}
  458.     set htmlElemAttrRequired1(META)    {CONTENT=}
  459.     set htmlElemAttrOptional1(META)    {NAME= HTTP-EQUIV=}
  460. }
  461.  
  462. #=============================================================================
  463. #
  464. #     HTML 3.2
  465. #
  466. #=============================================================================
  467.  
  468. proc html32 {} {
  469.     global htmlElemAttrRequired3 htmlElemAttrOptional3
  470.     global htmlElemAttrChoices3 htmlElemAttrNumber3
  471.     
  472.     set htmlElemAttrOptional3(HTML) {}
  473.     set htmlElemAttrOptional3(HEAD) {}
  474.     set htmlElemAttrOptional3(TITLE) {}
  475.     set htmlElemAttrOptional3(BODY)    {BACKGROUND= BGCOLOR= TEXT= LINK= VLINK= ALINK=}
  476.     htmlSetAttrUsed 3 BODY {BACKGROUND= BGCOLOR= TEXT= LINK= VLINK=}
  477.     
  478.     set htmlElemAttrOptional3(H1)    {ALIGN= }
  479.     set htmlElemAttrChoices3(H1)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  480.     htmlSetAttrUsed 3 H1    {ALIGN=}
  481.     set htmlElemAttrOptional3(H2)    {ALIGN= }
  482.     set htmlElemAttrChoices3(H2)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  483.     htmlSetAttrUsed 3 H2    {ALIGN=}
  484.     set htmlElemAttrOptional3(H3)    {ALIGN= }
  485.     set htmlElemAttrChoices3(H3)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  486.     htmlSetAttrUsed 3 H3    {ALIGN=}
  487.     set htmlElemAttrOptional3(H4)    {ALIGN= }
  488.     set htmlElemAttrChoices3(H4)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  489.     htmlSetAttrUsed 3 H4    {ALIGN=}
  490.     set htmlElemAttrOptional3(H5)    {ALIGN= }
  491.     set htmlElemAttrChoices3(H5)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  492.     htmlSetAttrUsed 3 H5    {ALIGN=}
  493.     set htmlElemAttrOptional3(H6)    {ALIGN= }
  494.     set htmlElemAttrChoices3(H6)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  495.     htmlSetAttrUsed 3 H6    {ALIGN=}
  496.     
  497.     set htmlElemAttrOptional3(P)    {ALIGN= }
  498.     set htmlElemAttrChoices3(P)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  499.     htmlSetAttrUsed 3 P    {ALIGN=}
  500.     set htmlElemAttrOptional3(BLOCKQUOTE) {}
  501.     set htmlElemAttrOptional3(DIV)    {ALIGN= }
  502.     set htmlElemAttrChoices3(DIV)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT}
  503.     htmlSetAttrUsed 3 DIV    {ALIGN=}
  504.     set htmlElemAttrOptional3(ADDRESS) {}
  505.     set htmlElemAttrOptional3(CENTER) {}
  506.     set htmlElemAttrOptional3(PRE)    {WIDTH= }
  507.     set htmlElemAttrNumber3(PRE)    {WIDTH=1:i:n}
  508.     set htmlElemAttrOptional3(BR)    {CLEAR= }
  509.     set htmlElemAttrChoices3(BR)    {CLEAR=ALL CLEAR=LEFT CLEAR=RIGHT CLEAR=NONE}
  510.     set htmlElemAttrOptional3(HR)    {ALIGN= SIZE= WIDTH= NOSHADE}
  511.     set htmlElemAttrChoices3(HR)    {ALIGN=LEFT ALIGN=RIGHT ALIGN=CENTER}
  512.     set htmlElemAttrNumber3(HR)     {SIZE=1:i:n WIDTH=1:i:%}
  513.     
  514.     set htmlElemAttrOptional3(FONT)    {SIZE= COLOR=}
  515.     set htmlElemAttrNumber3(FONT)    {SIZE=1:7:n}
  516.     htmlSetAttrUsed 3 FONT    {SIZE=}
  517.     set htmlElemAttrRequired3(BASEFONT)    {SIZE=}
  518.     set htmlElemAttrOptional3(BASEFONT) {}
  519.     set htmlElemAttrNumber3(BASEFONT)    {SIZE=1:7:n}
  520.     set htmlElemAttrOptional3(B) {}
  521.     set htmlElemAttrOptional3(I) {}
  522.     set htmlElemAttrOptional3(STRIKE) {}
  523.     set htmlElemAttrOptional3(U) {}
  524.     set htmlElemAttrOptional3(SUB) {}
  525.     set htmlElemAttrOptional3(SUP) {}
  526.     set htmlElemAttrOptional3(BIG) {}
  527.     set htmlElemAttrOptional3(SMALL) {}
  528.     set htmlElemAttrOptional3(EM) {}
  529.     set htmlElemAttrOptional3(STRONG) {}
  530.     set htmlElemAttrOptional3(DFN)    {}
  531.     set htmlElemAttrOptional3(CODE) {}
  532.     set htmlElemAttrOptional3(VAR) {}
  533.     set htmlElemAttrOptional3(CITE) {}
  534.     set htmlElemAttrOptional3(KBD) {}
  535.     set htmlElemAttrOptional3(TT) {}
  536.     set htmlElemAttrOptional3(SAMP) {}
  537.     
  538.     set htmlElemAttrOptional3(A)    {HREF= NAME= REL= REV=  TITLE= }
  539.     htmlSetAttrUsed 3 A    {HREF= NAME=}
  540.     set htmlElemAttrRequired3(IMG)    {SRC=}
  541.     set htmlElemAttrOptional3(IMG)    {WIDTH= HEIGHT=  BORDER= 
  542.     ALIGN= ALT= HSPACE= VSPACE= USEMAP= ISMAP}
  543.     set htmlElemAttrChoices3(IMG)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  544.     ALIGN=LEFT ALIGN=RIGHT}
  545.     set htmlElemAttrNumber3(IMG) {BORDER=0:i:n WIDTH=1:i:n HEIGHT=1:i:n
  546.     HSPACE=0:i:n VSPACE=0:i:n}
  547.     htmlSetAttrUsed 3 IMG    {SRC= WIDTH= HEIGHT= ALIGN= ALT=}
  548.     
  549.     set htmlElemAttrOptional3(UL)    {TYPE= COMPACT}
  550.     set htmlElemAttrChoices3(UL)    {TYPE=DISC TYPE=CIRCLE TYPE=SQUARE}
  551.     set htmlElemAttrOptional3([list LI IN UL])    {TYPE=}
  552.     set htmlElemAttrChoices3([list LI IN UL])    {TYPE=DISC TYPE=CIRCLE TYPE=SQUARE}
  553.     set htmlElemAttrOptional3(OL)    {TYPE= START= COMPACT}
  554.     set htmlElemAttrChoices3(OL)    {TYPE=A TYPE=a TYPE=I TYPE=i TYPE=1}
  555.     set htmlElemAttrNumber3(OL)    {START=1:i:n}
  556.     set htmlElemAttrOptional3([list LI IN OL])    {TYPE= VALUE=}
  557.     set htmlElemAttrNumber3([list LI IN OL])    {VALUE=1:i:n}
  558.     set htmlElemAttrChoices3([list LI IN OL])    {TYPE=A TYPE=a TYPE=I TYPE=i TYPE=1}
  559.     set htmlElemAttrOptional3(DIR) {COMPACT}
  560.     set htmlElemAttrOptional3(MENU) {COMPACT}
  561.     set htmlElemAttrOptional3(LI) {}
  562.     set htmlElemAttrOptional3(DL) {COMPACT}
  563.     set htmlElemAttrOptional3(DT) {}
  564.     set htmlElemAttrOptional3(DD)    {}
  565.     
  566.     set htmlElemAttrOptional3(FORM)    {ACTION= METHOD= ENCTYPE= }
  567.     set htmlElemAttrChoices3(FORM)    {METHOD=POST METHOD=GET}
  568.     htmlSetAttrUsed 3 FORM    {ACTION= METHOD= }
  569.     set htmlElemAttrRequired3(TEXT)    {NAME=}
  570.     set htmlElemAttrOptional3(TEXT)    {VALUE= SIZE= MAXLENGTH=}
  571.     set htmlElemAttrNumber3(TEXT)    {SIZE=1:i:n MAXLENGTH=1:i:n}
  572.     htmlSetAttrUsed 3 TEXT    {NAME= VALUE= SIZE= MAXLENGTH=}
  573.     set htmlElemAttrRequired3(CHECKBOX)    {NAME= VALUE=}
  574.     set htmlElemAttrOptional3(CHECKBOX)    {CHECKED}
  575.     htmlSetAttrUsed 3 CHECKBOX    {NAME= VALUE= CHECKED}
  576.     set htmlElemAttrRequired3(RADIO)    {NAME= VALUE=}
  577.     set htmlElemAttrOptional3(RADIO)    {CHECKED}
  578.     htmlSetAttrUsed 3 RADIO    {NAME= VALUE= CHECKED}
  579.     set htmlElemAttrOptional3(SUBMIT)    {NAME= VALUE=}
  580.     htmlSetAttrUsed 3 SUBMIT    {VALUE= }
  581.     set htmlElemAttrOptional3(RESET)    {VALUE= }
  582.     htmlSetAttrUsed 3 RESET    {VALUE= }
  583.     set htmlElemAttrRequired3(PASSWORD)    {NAME= }
  584.     set htmlElemAttrOptional3(PASSWORD)    {VALUE= SIZE= MAXLENGTH=}
  585.     set htmlElemAttrNumber3(PASSWORD)    {SIZE=1:i:n MAXLENGTH=1:i:n}
  586.     htmlSetAttrUsed 3 PASSWORD    {NAME= VALUE= SIZE= MAXLENGTH=}
  587.     set htmlElemAttrRequired3(HIDDEN)    {NAME= VALUE=}
  588.     set htmlElemAttrOptional3(HIDDEN)    {}
  589.     set htmlElemAttrRequired3(IMAGE)    {NAME= SRC=}
  590.     set htmlElemAttrOptional3(IMAGE)    {ALIGN=}
  591.     set htmlElemAttrChoices3(IMAGE)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM
  592.     ALIGN=LEFT ALIGN=RIGHT}
  593.     set htmlElemAttrRequired3(FILE)    {NAME= }
  594.     set htmlElemAttrOptional3(FILE)    {SIZE= MAXLENGTH=}
  595.     set htmlElemAttrNumber3(FILE)    {SIZE=1:i:n MAXLENGTH=1:i:n}
  596.     set htmlElemAttrRequired3(SELECT)    {NAME= }
  597.     set htmlElemAttrOptional3(SELECT)    {SIZE= MULTIPLE}
  598.     set htmlElemAttrNumber3(SELECT)     {SIZE=1:i:n}
  599.     htmlSetAttrUsed 3 SELECT    {NAME= SIZE= MULTIPLE}
  600.     set htmlElemAttrOptional3(OPTION)    {VALUE= SELECTED}
  601.     htmlSetAttrUsed 3 OPTION    {SELECTED}
  602.     set htmlElemAttrRequired3(TEXTAREA)    {NAME= ROWS= COLS=}
  603.     set htmlElemAttrOptional3(TEXTAREA)    {}
  604.     set htmlElemAttrNumber3(TEXTAREA)    {ROWS=1:i:n COLS=1:i:n}
  605.     
  606.     set htmlElemAttrOptional3(TABLE)    {BORDER= CELLSPACING= CELLPADDING= WIDTH= 
  607.     ALIGN=}
  608.     set htmlElemAttrChoices3(TABLE)    {ALIGN=LEFT ALIGN=CENTER ALIGN=RIGHT}
  609.     set htmlElemAttrNumber3(TABLE)    {BORDER=0:i:n CELLSPACING=0:i:n 
  610.     CELLPADDING=0:i:n WIDTH=1:i:%}
  611.     htmlSetAttrUsed 3 TABLE    {BORDER= CELLSPACING= CELLPADDING=}
  612.     set htmlElemAttrOptional3(TD)    {ALIGN= VALIGN= COLSPAN= ROWSPAN= WIDTH= HEIGHT= NOWRAP}
  613.     set htmlElemAttrChoices3(TD)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT 
  614.     VALIGN=BOTTOM VALIGN=MIDDLE VALIGN=TOP }
  615.     set htmlElemAttrNumber3(TD)    {COLSPAN=1:i:n ROWSPAN=1:i:n WIDTH=1:i:n HEIGHT=1:i:n}
  616.     htmlSetAttrUsed 3 TD    {ALIGN= VALIGN= COLSPAN= ROWSPAN= NOWRAP}
  617.     set htmlElemAttrOptional3(TH)    {ALIGN= VALIGN= COLSPAN= ROWSPAN= WIDTH= HEIGHT= NOWRAP}
  618.     set htmlElemAttrChoices3(TH)    {ALIGN=LEFT ALIGN=CENTER ALIGN=RIGHT 
  619.     VALIGN=BOTTOM VALIGN=MIDDLE VALIGN=TOP }
  620.     set htmlElemAttrNumber3(TH)    {COLSPAN=1:i:n ROWSPAN=1:i:n WIDTH=1:i:n HEIGHT=1:i:n}
  621.     htmlSetAttrUsed 3 TH    {ALIGN= VALIGN= COLSPAN= ROWSPAN= NOWRAP }
  622.     set htmlElemAttrOptional3(TR)    {ALIGN= VALIGN= }
  623.     set htmlElemAttrChoices3(TR)    {ALIGN=CENTER ALIGN=RIGHT ALIGN=LEFT  
  624.     VALIGN=BOTTOM VALIGN=MIDDLE VALIGN=TOP }
  625.     htmlSetAttrUsed 3 TR    {ALIGN= VALIGN=}
  626.     set htmlElemAttrOptional3(CAPTION)    {ALIGN=}
  627.     set htmlElemAttrChoices3(CAPTION)    {ALIGN=BOTTOM ALIGN=TOP }
  628.     htmlSetAttrUsed 3 CAPTION    {ALIGN=}    
  629.     
  630.     set htmlElemAttrRequired3(MAP)        {NAME=}
  631.     set htmlElemAttrOptional3(MAP)        {}
  632.     set htmlElemAttrRequired3(AREA)    {COORDS= ALT=}
  633.     set htmlElemAttrOptional3(AREA)    {SHAPE= HREF= NOHREF}
  634.     set htmlElemAttrChoices3(AREA)    {SHAPE=RECT SHAPE=CIRCLE SHAPE=POLY}
  635.     htmlSetAttrUsed 3 AREA    {SHAPE= COORDS= HREF= NOHREF}
  636.     
  637.     set htmlElemAttrRequired3(APPLET)    {CODE= WIDTH= HEIGHT=}
  638.     set htmlElemAttrOptional3(APPLET)     {CODEBASE= HSPACE= VSPACE= ALIGN= NAME= ALT=}
  639.     set htmlElemAttrChoices3(APPLET)    {ALIGN=TOP ALIGN=MIDDLE ALIGN=BOTTOM 
  640.     ALIGN=LEFT ALIGN=RIGHT}
  641.     set htmlElemAttrNumber3(APPLET)     {VSPACE=0:i:n HSPACE=0:i:n WIDTH=1:i:n
  642.     HEIGHT=1:i:n}
  643.     htmlSetAttrUsed 3 APPLET    {CODE= WIDTH= HEIGHT= CODEBASE= ALIGN= }
  644.     set htmlElemAttrRequired3(PARAM)    {NAME= VALUE=}
  645.     set htmlElemAttrOptional3(PARAM)    {}
  646.     
  647.     set htmlElemAttrRequired3(BASE)    {HREF= }
  648.     set htmlElemAttrOptional3(BASE)    {}
  649.     set htmlElemAttrOptional3(ISINDEX)    {PROMPT=}
  650.     set htmlElemAttrOptional3(LINK)    {HREF=  REL= REV= TITLE=}
  651.     htmlSetAttrUsed 3 LINK    {HREF=}
  652.     set htmlElemAttrRequired3(META)    {CONTENT=}
  653.     set htmlElemAttrOptional3(META)    {NAME= HTTP-EQUIV=}
  654. }
  655.  
  656.  
  657. #
  658. # Character entities
  659. #
  660. proc htmlNewCharVar {var val} {
  661.     global htmlSpecialCharacter
  662.     global htmlCharacterSpecial
  663.     set htmlSpecialCharacter($var) $val 
  664.     set htmlCharacterSpecial($val) $var
  665. }
  666.  
  667. proc htmlNewCapCharVar {var men val} {
  668.     global htmlSpecialCapCharacter
  669.     global htmlCapCharacterSpecial
  670.     global htmlCapCharSpecMenu
  671.     set htmlSpecialCapCharacter($var) $val 
  672.     set htmlCapCharacterSpecial($val) $var
  673.     set htmlCapCharSpecMenu($men) $val
  674. }
  675.  
  676. htmlNewCharVar "ß" szlig
  677. htmlNewCharVar "à" agrave
  678. htmlNewCharVar "á" aacute
  679. htmlNewCharVar "â" acirc
  680. htmlNewCharVar "ã" atilde
  681. htmlNewCharVar "ä" auml
  682. htmlNewCharVar "å" aring
  683. htmlNewCharVar "æ" aelig
  684. htmlNewCharVar "ç" ccedil
  685. htmlNewCharVar "è" egrave
  686. htmlNewCharVar "é" eacute
  687. htmlNewCharVar "ê" ecirc
  688. htmlNewCharVar "ë" euml
  689. htmlNewCharVar "ì" igrave
  690. htmlNewCharVar "í" iacute
  691. htmlNewCharVar "î" icirc
  692. htmlNewCharVar "ï" iuml
  693. htmlNewCharVar    "eth" eth
  694. htmlNewCharVar "ñ" ntilde
  695. htmlNewCharVar "ò" ograve
  696. htmlNewCharVar "ó" oacute
  697. htmlNewCharVar "ô" ocirc
  698. htmlNewCharVar "õ" otilde
  699. htmlNewCharVar "ö" ouml
  700. htmlNewCharVar "ø" oslash
  701. htmlNewCharVar "ù" ugrave
  702. htmlNewCharVar "ú" uacute
  703. htmlNewCharVar "û" ucirc
  704. htmlNewCharVar "ü"    uuml
  705. htmlNewCharVar "y´" yacute
  706. htmlNewCharVar "thorn" thorn
  707. htmlNewCharVar "ÿ"    yuml
  708.  
  709. htmlNewCapCharVar "À" "À" Agrave
  710. htmlNewCapCharVar "Á" "A´" Aacute
  711. htmlNewCapCharVar "Â" "A^" Acirc
  712. htmlNewCapCharVar "Ã" "Ã" Atilde
  713. htmlNewCapCharVar "Ä" "Ä" Auml
  714. htmlNewCapCharVar "Å" "Å" Aring
  715. htmlNewCapCharVar "Æ" "Æ" Aelig
  716. htmlNewCapCharVar "Ç" "Ç" Ccedil
  717. htmlNewCapCharVar "È" "E`" Egrave
  718. htmlNewCapCharVar "É" "É" Eacute
  719. htmlNewCapCharVar "Ê" "E^" Ecirc
  720. htmlNewCapCharVar "Ë" "E¨" Euml
  721. htmlNewCapCharVar "Ì" "I`" Igrave
  722. htmlNewCapCharVar "Í" "I´" Iacute
  723. htmlNewCapCharVar "Î" "I^" Icirc
  724. htmlNewCapCharVar "Ï" "I¨" Iuml
  725. htmlNewCapCharVar "ETH" "ETH" ETH
  726. htmlNewCapCharVar "Ñ" "Ñ" Ntilde
  727. htmlNewCapCharVar "Ò" "O`" Ograve
  728. htmlNewCapCharVar "Ó" "O´" Oacute
  729. htmlNewCapCharVar "Ô" "O^" Ocirc
  730. htmlNewCapCharVar "Õ" "Õ" Otilde
  731. htmlNewCapCharVar "Ö" "Ö" Ouml
  732. htmlNewCapCharVar "Ø" "Ø" Oslash
  733. htmlNewCapCharVar "Ù" "U`" Ugrave
  734. htmlNewCapCharVar "Ú" "U´" Uacute
  735. htmlNewCapCharVar "Û" "U^" Ucirc
  736. htmlNewCapCharVar "Ü" "Ü"    Uuml
  737. htmlNewCapCharVar "Y´" "Y´" Yacute
  738. htmlNewCapCharVar "THORN" "THORN" THORN
  739.  
  740. set htmlSpecialSymbCharacter(\")    quot
  741. set htmlSpecialSymbCharacter(ampersand) amp
  742. set htmlSpecialSymbCharacter([list less than]) lt
  743. set htmlSpecialSymbCharacter([list greater than]) gt
  744. set htmlSpecialSymbCharacter([list nonbreak space])    nbsp
  745. set htmlSpecialSymbCharacter(¡)    "#161"
  746. set htmlSpecialSymbCharacter(¢) "#162"
  747. set htmlSpecialSymbCharacter(£)    "#163"
  748. set htmlSpecialSymbCharacter(currency)    "#164"
  749. set htmlSpecialSymbCharacter(¥)    "#165"
  750. set htmlSpecialSymbCharacter(§) "#167"
  751. set htmlSpecialSymbCharacter(©)        copy
  752. set htmlSpecialSymbCharacter(ª)    "#170"
  753. set htmlSpecialSymbCharacter(«)    "#171"
  754. set htmlSpecialSymbCharacter(®)        reg
  755. set htmlSpecialSymbCharacter(°)    "#176"
  756. set htmlSpecialSymbCharacter(±) "#177"
  757. set htmlSpecialSymbCharacter(µ)    "#181"
  758. set htmlSpecialSymbCharacter(¶)    "#182"
  759. set htmlSpecialSymbCharacter(middot) "#183"
  760. set htmlSpecialSymbCharacter(º) "#186"
  761. set htmlSpecialSymbCharacter(») "#187"
  762. set htmlSpecialSymbCharacter([list a quarter]) "#188"
  763. set htmlSpecialSymbCharacter([list a half]) "#189"
  764. set htmlSpecialSymbCharacter([list three quarters]) "#190"
  765. set htmlSpecialSymbCharacter(¿)    "#191"
  766. set htmlSpecialSymbCharacter(times)    "#215"
  767. set htmlSpecialSymbCharacter(÷)    "#247"
  768.  
  769. # Colors for background, text and links
  770. #
  771.  
  772. proc htmlNewColor {var val } {
  773.     global htmlColorName
  774.     global htmlColorNumber
  775.     set htmlColorName($var) $val 
  776.     set htmlColorNumber($val) $var
  777. }
  778. htmlNewColor black        "#000000"
  779. htmlNewColor silver        "#C0C0C0"
  780. htmlNewColor gray        "#808080"
  781. htmlNewColor white        "#FFFFFF"
  782. htmlNewColor maroon        "#800000"
  783. htmlNewColor red        "#FF0000"
  784. htmlNewColor purple        "#800080"
  785. htmlNewColor fuchsia    "#FF00FF"
  786. htmlNewColor green        "#008000"
  787. htmlNewColor lime        "#00FF00"
  788. htmlNewColor olive        "#808000"
  789. htmlNewColor yellow        "#FFFF00"
  790. htmlNewColor navy        "#000080"
  791. htmlNewColor blue        "#0000FF"
  792. htmlNewColor teal        "#008080"
  793. htmlNewColor aqua        "#00FFFF"
  794.  
  795. # Remove colors conflicting with the new ones
  796. foreach tmpCol [array names htmluserColors] {
  797.     if {[info exists htmlColorName($tmpCol)]} {
  798.         htmlColordelete $tmpCol $htmluserColors($tmpCol)
  799.     }
  800. }
  801. foreach tmpCol [array names htmluserColorname] {
  802.     if {[info exists htmlColorNumber($tmpCol)]} {
  803.         htmlColordelete $htmluserColorname($tmpCol) $tmpCol
  804.     }
  805. }
  806. catch {unset tmpCol}
  807. # A list of colours
  808. set basicColors [lsort [array names htmlColorName]]
  809.  
  810. rename htmlNewCharVar ""
  811. rename htmlNewCapCharVar ""
  812. rename htmlNewColor ""
  813.  
  814. #===============================================================================
  815. # Menu Processing
  816. #===============================================================================
  817.  
  818. proc htmlMenuItem {menu item} {
  819.     global htmlMenu HOME htmlElemProc
  820.  
  821.     switch -glob $menu {
  822.         "•*" {
  823.             switch $item {
  824.                 "New Document"    {htmlNewTemplate BODY}
  825.                 "Palette"     { float -m $htmlMenu -n HTML -z HTML }
  826.                 "Help"            {edit -r -c "$HOME:Help:HTML Help"}
  827.                 "Manual"    {htmlManual}
  828.             }
  829.         }
  830.         "Browsers" {
  831.             switch $item {
  832.                 "Send File to Browser"    {htmlSendWindow}
  833.                 "Add"    {htmlAddBrowser}
  834.                 "Remove" {htmlRemoveBrowser}
  835.                 default {htmlToggleBrowser $item}
  836.             }
  837.         }
  838.         "Packages"    {
  839.             switch $item {
  840.                 "HTML 3.2"    {htmlLoadPackage 3}
  841.                 "Extensions" {htmlLoadPackage 1}
  842.             }
  843.         }
  844.         "HTML Utilities" {
  845.             switch $item {
  846.                 "Colors"            {htmlColors}
  847.                 "Footers"            {htmlFooters}
  848.                 "Home Pages"        {htmlHomePages}
  849.                 "Move Files"        {htmlMoveFiles}
  850.                 "Last Modified"     {htmlInsertLastMod}
  851.             }
  852.         }
  853.         "Editing" {
  854.             switch $item {
  855.                 "Select Container"    {htmlBalance 0}
  856.                 "Select in Container" {htmlBalance 1}
  857.                 "Select Opening"    {htmlSelectOpening 0}
  858.                 "Untag"                {htmlUnTag 0}
  859.                 "Untag and Select"    {htmlUnTag 1}
  860.                 "Remove Opening"    {htmlSelectOpening 1}
  861.                 "Change Container"    {htmlChangeContainer}
  862.                 "Change Opening"    {htmlChangeOpening}
  863.                 "Change Choice"        {htmlChangeChoice}
  864.                 "Reveal Color" {htmlRevealColor}
  865.                 "Remove Marks"        {htmlTabDeleteAll}
  866.             }
  867.         }
  868.         "Character Translation"    {
  869.             switch $item {
  870.                 "åäö -> HTML"        {htmlCharacterstohtml 0}
  871.                 "HTML -> åäö"    {htmltoCharacters 0}
  872.                 "<>& -> HTML"    {htmlCharacterstohtml 1}
  873.                 "HTML -> <>&"    {htmltoCharacters 1}
  874.             }
  875.         }
  876.         "URLs"    {
  877.             switch $item {
  878.                 "Clean Up"        {htmlCleanUpCache URLs}
  879.                 "Clear"            {htmlClearCache URLs}
  880.                 "Import"        {htmlImportURL}
  881.                 "Export"        {htmlExportURL}
  882.                 "Add Folder"    {htmlFolderToURL}
  883.                 "Add Selection"    {htmlSelToURL}
  884.                 "Add Clipboard"    {htmlScrapToURL}
  885.             }
  886.         }
  887.         "Windows"    {
  888.             switch $item {
  889.                 "Clean Up"    {htmlCleanUpCache windows}
  890.                 "Clear"        {htmlClearCache windows}
  891.             }
  892.         }
  893.         "Check Links" {
  894.             switch $item {
  895.                 "Use Big Brother" {htmlToggleBrother}
  896.                 default {htmlCheckLinks [lindex $item 1]}
  897.             }                
  898.         }
  899.         "Includes" {
  900.             switch $item {
  901.                 "Insert Include Tags" {htmlNewInclude}
  902.                 default {htmlUpdateInclude [lindex $item 1]}
  903.             }
  904.         }
  905.         "Extend" {
  906.             switch $item {
  907.                 "New Element" {htmlCustomNewElem}
  908.                 "New Attributes" {htmlCustomNewAttr}
  909.                 "New Choices"    {htmlCustomNewChoice}
  910.                 "Change Key Binding" {htmlCustomChangeKey}
  911.                 "Change Type and Layout" {htmlCustomChangeType}
  912.                 "Remove Attributes" {htmlCustomRemoveAttrs}
  913.                 "Remove Additions" {htmlCustomRemove}
  914.             }
  915.         }
  916.         "Use Attributes"    {
  917.             htmlUseAttrs $item
  918.         }
  919.         "Headers" {
  920.              switch $item {
  921.                 "Header1"    {htmlBuildCRElem H1  1}
  922.                 "H1 no attr" {htmlBuildCRElem H1 1 NOATTR}
  923.                 "Header2"    {htmlBuildCRElem H2  1}
  924.                 "H2 no attr" {htmlBuildCRElem H2 1 NOATTR}
  925.                 "Header3"    {htmlBuildCRElem H3  1}
  926.                 "H3 no attr" {htmlBuildCRElem H3 1 NOATTR}
  927.                 "Header4"    {htmlBuildCRElem H4  1}
  928.                 "H4 no attr" {htmlBuildCRElem H4 1 NOATTR}
  929.                 "Header5"    {htmlBuildCRElem H5  1}
  930.                 "H5 no attr" {htmlBuildCRElem H5 1 NOATTR}
  931.                 "Header6"    {htmlBuildCRElem H6  1}
  932.                 "H6 no attr" {htmlBuildCRElem H6 1 NOATTR}
  933.             }
  934.         }
  935.         "Blocks and Dividers" {
  936.             switch $item {
  937.                 "Insert Line Breaks" {htmlInsertLineBreaks}
  938.                 "Remove Line Breaks" {htmlRemoveLineBreaks}
  939.                 "Insert Paragraphs" {htmlInsertParagraphs}
  940.                 "Paragraph"    {htmlElemParagraph}
  941.                 "P no attr" {htmlElemParagraph NOATTR}
  942.                 "Division"        {htmlBuildCR2Elem DIV}
  943.                 "DIV no attr"        {htmlBuildCR2Elem DIV NOATTR}
  944.                 "Block Quote"    {htmlBuildCR2Elem BLOCKQUOTE}
  945.                 "Address"        {htmlBuildCRElem ADDRESS}
  946.                 "Center"        {htmlBuildCR2Elem CENTER}
  947.                 "Preformatted"    {htmlBuildCR2Elem PRE}
  948.                 "Multi Column"    {htmlBuildCR2Elem MULTICOL}
  949.                 "Spacing"        {htmlBuildOpening SPACER}
  950.                 "Line Break"        {htmlBuildOpening BR 0 1}
  951.                 "BR no attr"        {htmlBuildOpening BR 0 1 NOATTR}
  952.                 "Horizontal Rule"    {htmlBuildOpening HR 1 1}
  953.                 "HR no attr"    {htmlBuildOpening HR 1 1 NOATTR}
  954.                 "No Line Break"    {htmlBuildElem NOBR}
  955.                 "Word Break"    {htmlBuildOpening WBR 0 1}
  956.             }
  957.         }
  958.         "Styles"    {
  959.             switch $item {
  960.                 "Font"            {htmlBuildElem FONT}
  961.                 "Basefont"        {htmlBuildOpening BASEFONT 1 1}
  962.                 "Bold"            {htmlBuildElem B}
  963.                 "Italic"        {htmlBuildElem I}
  964.                 "Strike out"    {htmlBuildElem STRIKE}
  965.                 "Underlined"    {htmlBuildElem U}
  966.                 "Subscript"        {htmlBuildElem SUB}
  967.                 "Superscript"    {htmlBuildElem SUP}
  968.                 "Bigger"        {htmlBuildElem BIG}
  969.                 "Smaller"        {htmlBuildElem SMALL}
  970.                 "Emphasis"        {htmlBuildElem EM}
  971.                 "Strong"        {htmlBuildElem STRONG}
  972.                 "Definition"    {htmlBuildElem DFN}
  973.                 "Code"            {htmlBuildElem CODE}
  974.                 "Variable"        {htmlBuildElem VAR}
  975.                 "Citation"        {htmlBuildElem CITE}
  976.                 "Keyboard"        {htmlBuildElem KBD}
  977.                 "Typewriter"    {htmlBuildElem TT}
  978.                 "Sample"        {htmlBuildElem SAMP}
  979.                 "Blinking"        {htmlBuildElem BLINK}
  980.             }
  981.         }
  982.         "Links"    {
  983.             switch $item {
  984.                 "Link or Anchor" {htmlBuildElem A}
  985.                 "Image"    {htmlBuildOpening IMG}
  986.             }
  987.         }
  988.         "Plug-ins" {
  989.             switch $item {
  990.                 "General" {htmlBuildOpening EMBED}
  991.                 "LiveAudio" {htmlBuildOpening EMBED 0 0 LIVEAUDIO}
  992.                 "LiveVideo" {htmlBuildOpening EMBED 0 0 LIVEVIDEO}
  993.                 "QuickTime Movie" {htmlBuildOpening EMBED 0 0 "QUICKTIME MOVIE"}
  994.                 "QuickTime VR" {htmlBuildOpening EMBED 0 0 "QUICKTIME VR"}
  995.                 "RealAudio"    {htmlBuildOpening EMBED 0 0 REALAUDIO}
  996.                 "No Embed" {htmlBuildCR2Elem NOEMBED}
  997.             }
  998.         }
  999.         "Lists"    {
  1000.             switch $item {
  1001.                 "Make List"    {htmlMakeList}
  1002.                 "Bulleted"    {htmlBuildList UL "LI IN UL" UL}
  1003.                 "UL no attr"    {htmlBuildList UL NOATTR NOATTR}
  1004.                 "New Bulleted Item" {htmlElemListEntry "LI IN UL"}
  1005.                 "Numbered"    {htmlBuildList OL "LI IN OL" OL}
  1006.                 "OL no attr"    {htmlBuildList OL NOATTR NOATTR}
  1007.                 "New Numbered Item" {htmlElemListEntry "LI IN OL"}
  1008.                 "Directory"    {htmlBuildList DIR LI}
  1009.                 "Menu"        {htmlBuildList MENU LI}
  1010.                 "New List Item"    {htmlElemListEntry LI}
  1011.                 "Discursive"    {htmlBuildDiscList}
  1012.                 "New Discursive Entry"    {htmlElemDiscEntry}
  1013.             }
  1014.         }
  1015.         "Forms" {
  1016.             switch $item {
  1017.                 "Form"        {htmlBuildCR2Elem FORM}
  1018.                 "Text"        {htmlBuildInputElem TEXT}
  1019.                 "Checkbox"    {htmlBuildInputElem CHECKBOX}
  1020.                 "Button"    {htmlBuildInputElem BUTTON}
  1021.                 "Radio"        {htmlBuildInputElem RADIO}
  1022.                 "Submit"        {htmlBuildInputElem SUBMIT}
  1023.                 "Reset"        {htmlBuildInputElem RESET}
  1024.                 "Password"    {htmlBuildInputElem PASSWORD}
  1025.                 "Hidden"        {htmlBuildInputElem HIDDEN}
  1026.                 "Image"        {htmlBuildInputElem IMAGE}
  1027.                 "File Upload" {htmlBuildInputElem FILE}
  1028.                 "Select"        {htmlBuildCR2Elem SELECT}
  1029.                 "Option"        {htmlBuildOpening OPTION 1 0}
  1030.                 "Textarea"    {htmlBuildCRElem TEXTAREA}
  1031.             }
  1032.         }
  1033.         "Tables" {
  1034.             switch $item {
  1035.                 "Table Template" {htmlTableTemplate}
  1036.                 "Tabs to Rows"        {htmltabsToRows selection}
  1037.                 "Rows to Tabs"        {htmlrowsToTabs}
  1038.                 "Import Table" {htmltabsToRows file}
  1039.                 Table    {htmlBuildCR2Elem TABLE}
  1040.                 Row        {htmlBuildCR2Elem TR}
  1041.                 "TR no attr"        {htmlBuildCR2Elem TR NOATTR}
  1042.                 Header        {htmlBuildElem TH}
  1043.                 "TH no attr"        {htmlBuildElem TH NOATTR}
  1044.                 Cell        {htmlBuildElem TD}
  1045.                 "TD no attr"        {htmlBuildElem TD NOATTR}
  1046.                 Caption    {htmlBuildCRElem CAPTION}
  1047.             }
  1048.         }
  1049.         "Frames" {
  1050.             switch $item {
  1051.                 "New Doc. with Frames"    {htmlNewTemplate FRAMESET}
  1052.                 Frameset        {htmlBuildCR2Elem FRAMESET}
  1053.                 Frame        {htmlBuildOpening FRAME 0 1}
  1054.                 "No Frames"    {htmlBuildCR2Elem NOFRAMES}
  1055.             }
  1056.         }
  1057.         "Image Maps" {
  1058.             switch $item {
  1059.                 "Convert NCSA Map" {htmlConvertMap NCSA}
  1060.                 "Convert CERN Map" {htmlConvertMap CERN}
  1061.                 Map        {htmlBuildCR2Elem MAP}
  1062.                 Area    {htmlBuildOpening AREA 0 1}
  1063.             }
  1064.         }
  1065.         "Java"    {
  1066.             switch $item {
  1067.                 Applet    {htmlBuildCR2Elem APPLET}
  1068.                 Parameter {htmlBuildOpening PARAM 0 1}
  1069.                 Script    {htmlBuildCR2Elem SCRIPT}
  1070.                 "No Script" {htmlBuildCR2Elem NOSCRIPT}
  1071.             }
  1072.         }
  1073.         "Other"    {
  1074.             switch $item {
  1075.                 "Comment"    {htmlElemComment}
  1076.                 "Base"    {htmlBuildOpening BASE 1 1}
  1077.                 "Isindex" {htmlBuildOpening ISINDEX 1 1}
  1078.                 "Link"    {htmlBuildOpening LINK 1 1}
  1079.                 "Meta"    {htmlBuildOpening META 1 1}
  1080.                 "Comment Line" {htmlDividingLine}
  1081.             }
  1082.         }
  1083.         "Character Entities"    {
  1084.             switch $item {
  1085.                 "Add"    {htmlAddCommonChars}
  1086.                 "Default" {htmlDefaultCommonChars}
  1087.                 "Clear"    {htmlClearCommonChars}
  1088.                 default        {htmlInsertCharacter $item}
  1089.             }
  1090.         }
  1091.         "Small Chars" {
  1092.             switch $item {
  1093.                 default        {htmlInsertCharacter $item}
  1094.             }
  1095.         }
  1096.         "Capital Chars" {
  1097.             switch $item {
  1098.                 default        {htmlInsertCharacter $item}
  1099.             }
  1100.         }
  1101.         "Other Chars" {
  1102.             switch $item {
  1103.                 default        {htmlInsertCharacter $item}
  1104.             }
  1105.         }
  1106.         "Custom"    {
  1107.             catch {eval $htmlElemProc([string toupper $item])}
  1108.         }
  1109.     }
  1110. }
  1111.  
  1112. #
  1113. # The menu.
  1114. #
  1115. # This is built up with lappends because I want parts of it to be 
  1116. # dynamic, to depend on which elements have attributes defined on 
  1117. # them.
  1118. #
  1119. # <B = control <I = option <U = shift <O = command <S = dynamical
  1120.  
  1121. proc htmlBuildMenu {} {
  1122.     global htmlCustomMenuList htmlPackageToUse modifiedModeVars
  1123.     global htmlMenu HTMLmodeVars htmlSpecialCharacter htmlBrowsers
  1124.     global htmlCapCharSpecMenu htmlSpecialSymbCharacter browserSig
  1125.     global htmlExtIsLoaded html32IsLoaded htmlElemKeyBinding
  1126.     global htmlShownWarning htmlElemAttrOptional1 htmlElemAttrOptional3 htmlAdditionExist
  1127.     
  1128.     set commonChars $HTMLmodeVars(commonChars)
  1129. # htmlPackageToUse must be set here. It's used globally in many places.
  1130.     set htmlPackageToUse $HTMLmodeVars(htmlPackageToUse)
  1131.     # Check if user used HTML 2.0!
  1132.     if {[lsearch -exact {1 3} $htmlPackageToUse] < 0} {
  1133.         set htmlPackageToUse 3
  1134.         set HTMLmodeVars(htmlPackageToUse) 3
  1135.         lappend modifiedModeVars {htmlPackageToUse HTMLmodeVars}
  1136.     }
  1137.     
  1138.     if {$htmlPackageToUse == 1} {
  1139.         if {!$htmlExtIsLoaded} {
  1140.             htmlExtensions
  1141.             set htmlExtIsLoaded 1
  1142.             rename htmlExtensions ""
  1143.         }
  1144.     } else {        
  1145.         if {!$html32IsLoaded} {
  1146.             html32
  1147.             set html32IsLoaded 1
  1148.             rename html32 ""
  1149.         }
  1150.     }
  1151.     
  1152.     # start empty
  1153.     set htmlMenuList {}
  1154.     
  1155.     # Browsers
  1156.     set htmlBrowserMenu [list menu -M HTML -p htmlMenuItem -m -n Browsers \
  1157.     [list "<S<O<U/SSend File to Browser" "(-" "Add…" "Remove…" "(-"]]
  1158.     
  1159.     lappend htmlMenuList $htmlBrowserMenu "<SManual" "<SHelp" 
  1160.     
  1161.     # Temporarily keep palette.
  1162.     if {[regexp {[0-9]+.[0-9]+} [lindex [version] 2] vrs] && $vrs < 6.51} {
  1163.         lappend htmlMenuList "Palette"
  1164.     }
  1165.     
  1166.     # Packages
  1167.     set htmlPackagesMenu [list menu -M HTML -p htmlMenuItem -m -n Packages \
  1168.         [list "HTML 3.2" "Extensions" ]]
  1169.     lappend htmlMenuList $htmlPackagesMenu
  1170.     
  1171. #===============================================================================
  1172. # Utilities
  1173. #===============================================================================
  1174.     
  1175.     # Editing
  1176.     set htmlEditMenu [list menu -M HTML -p htmlMenuItem -m -n "Editing" \
  1177.     [list "<S<O/BSelect Container" "<S<O<I/BSelect Opening" \
  1178.     "<O<U/BSelect in Container" \
  1179.     "<S<B/eUntag" "<S<B<I/eUntag and Select" "<B/fRemove Opening" \
  1180.     "<S<B/gChange Container" "<S<B<I/gChange Opening" "<B/hChange Choice" \
  1181.     "<B/iReveal Color" "<O/cRemove Marks"]]
  1182.     lappend tmpMenuList $htmlEditMenu
  1183.         
  1184.     # Character conversion
  1185.     set htmlConvertMenu [list menu -M HTML -p htmlMenuItem -m -n  "Character Translation" \
  1186.         [list "åäö -> HTML" "HTML -> åäö"]]
  1187.     lappend tmpMenuList $htmlConvertMenu
  1188.  
  1189.     # URLs
  1190.     set htmlURLsMenu [list menu -M HTML -p htmlMenuItem -m -n "URLs" [list "Clean Up…" \
  1191.             "Clear" "Import…" "Export…" "Add Folder…" "Add Selection" "Add Clipboard"]]
  1192.     lappend tmpMenuList $htmlURLsMenu
  1193.     
  1194.     # Windows
  1195.     set htmlWinMenu [list menu -M HTML -p htmlMenuItem -m -n "Windows" [list \
  1196.             "Clean Up…" "Clear"]]
  1197.     lappend tmpMenuList $htmlWinMenu
  1198.         
  1199.     # Check links
  1200.     set htmlCheckLinkMenu [list menu -M HTML -p htmlMenuItem -m -n "Check Links" \
  1201.     [list "Check Window" "Check Home Page" "Check Folder" "Check File" "(-" "Use Big Brother"]]
  1202.     lappend tmpMenuList $htmlCheckLinkMenu
  1203.  
  1204.     #Includes
  1205.     set htmlIncludeMenu [list menu -M HTML -p htmlMenuItem -m -n "Includes" \
  1206.     [list "Insert Include Tags…" "(-" "Update Window" "Update Home Page" "Update Folder" "Update File"]]
  1207.     lappend tmpMenuList $htmlIncludeMenu
  1208.  
  1209.     # Extending HTML mode.
  1210.     if {$htmlPackageToUse == 1} {
  1211.         set htmlExtendMenu [list menu -M HTML -p htmlMenuItem -m -n "Extend" \
  1212.         [list "New Element" "New Attributes" "New Choices" "Change Key Binding" \
  1213.         "Change Type and Layout" "Remove Attributes" "Remove Additions"]]
  1214.         lappend tmpMenuList $htmlExtendMenu
  1215.     }
  1216.     
  1217.     set htmlUtilitiesMenu [list menu -M HTML -p htmlMenuItem -m \
  1218.     -n "HTML Utilities" [concat [list "Colors…" "Home Pages…" "Footers…" "(-"] \
  1219.     $tmpMenuList [list "(-" "Move Files…" "(-" "Last Modified…"]]]
  1220.     lappend htmlMenuList $htmlUtilitiesMenu
  1221.  
  1222.     # Use Attributes
  1223.     # Dynamically-built list of elements whose default attributes can be selected
  1224.     
  1225.     foreach a [array names htmlElemAttrOptional$htmlPackageToUse] {
  1226.         if {[llength [set htmlElemAttrOptional${htmlPackageToUse}($a)]]} {lappend htmlPossibleToUse $a}
  1227.     }
  1228.     set htmlUseAttrsMenu [list menu -M HTML -p htmlMenuItem -m -n "Use Attributes" \
  1229.         [lsort $htmlPossibleToUse]]
  1230.     lappend htmlMenuList $htmlUseAttrsMenu
  1231.  
  1232.  
  1233.     # New document
  1234.     lappend htmlMenuList "(-" "<B<U<I/DNew Document"
  1235.     
  1236.     # Header1, Header2...
  1237.     set htmlHeadersMenu [list menu -M HTML -p htmlMenuItem -m -n Headers \
  1238.     [list "<S<B<O/1Header1" "<S<B<I<O/1H1 no attr" \
  1239.     "<S<B<O/2Header2" "<S<B<I<O/2H2 no attr" \
  1240.     "<S<B<O/3Header3" "<S<B<I<O/3H3 no attr"\
  1241.     "<S<B<O/4Header4" "<S<B<I<O/4H4 no attr"\
  1242.     "<S<B<O/5Header5" "<S<B<I<O/5H5 no attr" \
  1243.     "<S<B<O/6Header6" "<S<B<I<O/6H6 no attr"]]
  1244.     
  1245.     lappend htmlMenuList $htmlHeadersMenu
  1246.     
  1247.  
  1248.     # Blocks and Dividers
  1249.     if  {$htmlPackageToUse == 1} {
  1250.         set htmlBlocksMenu [list menu -M HTML -p htmlMenuItem -m -n "Blocks and Dividers" \
  1251.         [list "<E<SRemove Line Breaks" "<SInsert Line Breaks" \
  1252.         "Insert Paragraphs" "(-" \
  1253.         "<S<U/bParagraph" "<S<U<I/bP no attr" \
  1254.         "<E<S<U<O/bDivision" "<S<U<I<O/bDIV no attr" \
  1255.         "<B<O/QBlock Quote" "<B<O/SAddress" \
  1256.         "<B<O/CCenter" "<B<O/PPreformatted" "<B<O/XMulti Column" "<B<O/ZSpacing" \
  1257.         "(-" "<S<O/bLine Break" "<S<I<O/bBR no attr" \
  1258.         "<S<B<O/HHorizontal Rule" "<S<B<I<O/HHR no attr" \
  1259.         "<B<O/BNo Line Break" "<B<O/WWord Break"]]
  1260.     } else {
  1261.         set htmlBlocksMenu [list menu -M HTML -p htmlMenuItem -m -n "Blocks and Dividers" \
  1262.         [list "<E<SRemove Line Breaks" "<SInsert Line Breaks" \
  1263.         "Insert Paragraphs" "(-" \
  1264.         "<S<U/bParagraph" "<S<U<I/bP no attr" \
  1265.         "<E<S<U<O/bDivision" "<S<U<I<O/bDIV no attr" \
  1266.         "<B<O/QBlock Quote" "<B<O/SAddress" \
  1267.         "<B<O/CCenter" "<B<O/PPreformatted" \
  1268.         "(-" "<S<O/bLine Break" "<S<I<O/bBR no attr" \
  1269.         "<S<B<O/HHorizontal Rule" "<S<B<I<O/HHR no attr"]]
  1270.     }
  1271.     
  1272.     lappend htmlMenuList $htmlBlocksMenu
  1273.  
  1274.  
  1275.     # Styles
  1276.     if {$htmlPackageToUse ==1} {
  1277.         set htmlStylesMenu [list menu -M HTML -p htmlMenuItem -m -n Styles \
  1278.         [list "<B<I/FFont" "<B<I/NBasefont" "(-" "<B<I/BBold" "<B<I/IItalic" \
  1279.         "<B<I/-Strike out" "<B<I<O/-Underlined" "<B<I/.Superscript" "<B<I/,Subscript"\
  1280.         "<O<B<I/.Bigger" "<O<B<I/,Smaller" "<B<I/TTypewriter" "<B<I/ZBlinking" \
  1281.         "(-" "<B<I/EEmphasis" "<B<I/SStrong" \
  1282.         "<B<I/DDefinition" "<B<I/CCode" "<B<I/VVariable" \
  1283.         "<B<I/XCitation" "<B<I/KKeyboard" \
  1284.         "<B<I/PSample"]]
  1285.     } else {
  1286.         set htmlStylesMenu [list menu -M HTML -p htmlMenuItem -m -n Styles \
  1287.         [list  "<B<I/FFont" "<B<I/NBasefont" "(-" "<B<I/BBold" "<B<I/IItalic" \
  1288.         "<B<I/-Strike out" "<B<I<O/-Underlined" "<B<I/.Superscript" "<B<I/,Subscript"\
  1289.         "<O<B<I/.Bigger" "<O<B<I/,Smaller" "<B<I/TTypewriter" "(-" "<B<I/EEmphasis"\
  1290.         "<B<I/SStrong" "<B<I/DDefinition" "<B<I/CCode" "<B<I/VVariable" \
  1291.         "<B<I/XCitation" "<B<I/KKeyboard" \
  1292.         "<B<I/PSample" ]]
  1293.     }    
  1294.     
  1295.     lappend htmlMenuList $htmlStylesMenu
  1296.     
  1297.  
  1298.     # Links
  1299.     set htmlLinksMenu [list menu -M HTML -p htmlMenuItem -m -n Links \
  1300.     [list "<B<O/ALink or Anchor" \
  1301.     "<B<O/IImage" ]]
  1302.     
  1303.     lappend htmlMenuList $htmlLinksMenu
  1304.     
  1305.     # Plug-ins
  1306.     if {$htmlPackageToUse == 1} {
  1307.         set htmlPluginMenu [list menu -M HTML -p htmlMenuItem -m -n Plug-ins \
  1308.         [list "<B<O/EGeneral" "LiveAudio" "LiveVideo" "QuickTime Movie" \
  1309.         "QuickTime VR" "RealAudio" (- "<B<O/NNo Embed"]]
  1310.         lappend htmlMenuList $htmlPluginMenu
  1311.     }
  1312.     
  1313.     # Lists    
  1314.     set htmlListsMenu [list menu -M HTML -p htmlMenuItem -m -n Lists \
  1315.     [list "Make List" "(-" "<S<B<O/UBulleted" "<S<B<I<O/UUL no attr" \
  1316.     "<B<I/UNew Bulleted Item" "<S<B<O/ONumbered" "<S<B<I<O/OOL no attr"\
  1317.     "<B<I/ONew Numbered Item" "<B<O/DDirectory" \
  1318.     "<B<O/MMenu" "<B<I/LNew List Item" "(-" \
  1319.     "<U<B<O/DDiscursive" "<B<I<O/LNew Discursive Entry"]]
  1320.     
  1321.     lappend htmlMenuList $htmlListsMenu
  1322.  
  1323.  
  1324.     # Forms
  1325.     if {$htmlPackageToUse == 1} {
  1326.         set htmlFormsMenu [list menu -M HTML -p htmlMenuItem -m -n Forms \
  1327.         [list "<B<U/FForm" "(-" "<B<U/TText" "<B<U/BCheckbox" "<B<U/NButton" \
  1328.         "<B<U/RRadio" "<B<U/SSubmit" \
  1329.         "<B<U/CReset" "<B<U/PPassword" "<B<U/HHidden" "<B<U/IImage" "<B<U/UFile Upload" \
  1330.         "(-" "<B<I<U/SSelect" "<B<U/OOption" "<B<U<I/TTextarea"]]
  1331.     } else {
  1332.         set htmlFormsMenu [list menu -M HTML -p htmlMenuItem -m -n Forms \
  1333.         [list "<B<U/FForm" "(-" "<B<U/TText" "<B<U/BCheckbox" \
  1334.         "<B<U/RRadio" "<B<U/SSubmit" \
  1335.         "<B<U/CReset" "<B<U/PPassword" "<B<U/HHidden" "<B<U/IImage" "<B<U/UFile Upload" \
  1336.         "(-" "<B<I<U/SSelect" "<B<U/OOption" "<B<U<I/TTextarea"]]
  1337.     }    
  1338.     
  1339.     lappend htmlMenuList $htmlFormsMenu
  1340.     
  1341.     
  1342.     # Tables
  1343.     set htmlTablesMenu [list menu -M HTML -p htmlMenuItem -m -n Tables \
  1344.     [list "Table Template…" "<E<SRows to Tabs" "<STabs to Rows" "Import Table…" "(-" \
  1345.     "<U<O/TTable" "<S<U<O/RRow" "<S<U<I<O/RTR no attr" \
  1346.     "<S<U<O/HHeader" "<S<U<I<O/HTH no attr" \
  1347.     "<S<U<O/DCell" "<S<U<I<O/DTD no attr" "<U<O/CCaption"]]
  1348.     lappend htmlMenuList $htmlTablesMenu
  1349.     
  1350.  
  1351.     # Frames
  1352.     if {$htmlPackageToUse == 1} {    
  1353.         set htmlFramesMenu [list menu -M HTML -p htmlMenuItem -m -n Frames \
  1354.         [list "<B<U<I/FNew Doc. with Frames" "<B<U<I/OFrameset" \
  1355.         "<B<U<I/RFrame" "<B<U<I/NNo Frames"]]
  1356.         lappend htmlMenuList $htmlFramesMenu
  1357.     }
  1358.     
  1359.  
  1360.     # Client-side image maps 
  1361.     set htmlImageMenu [list menu -M HTML -p htmlMenuItem -m -n "Image Maps" \
  1362.     [list "Convert NCSA Map…" "Convert CERN Map…" "(- " "<B<U/MMap" "<B<U/AArea"]]
  1363.     lappend htmlMenuList $htmlImageMenu
  1364.     
  1365.  
  1366.     # Java
  1367.     if {$htmlPackageToUse == 1} {    
  1368.         set htmlJavaMenu [list menu -M HTML -p htmlMenuItem -m -n "Java" \
  1369.         [list "<U<I<O/JApplet" "<U<I<O/PParameter" "<U<I<O/SScript" "<U<I<O/NNo Script"]]
  1370.         lappend htmlMenuList $htmlJavaMenu
  1371.     } else {
  1372.         set htmlJavaMenu [list menu -M HTML -p htmlMenuItem -m -n "Java" \
  1373.         [list "<U<I<O/JApplet" "<U<I<O/PParameter"]]
  1374.         lappend htmlMenuList $htmlJavaMenu
  1375.     }
  1376.  
  1377.     # Other stuff, miscellaneous
  1378.     set htmlOtherMenu [list menu -M HTML -p htmlMenuItem -m -n "Other" \
  1379.         [list  "<B<U<I/CComment" \
  1380.          "<B<U<I/BBase" "<B<U<I/IIsindex" "<B<U<I/LLink" "<B<U<I/MMeta" \
  1381.          "Comment Line"]]
  1382.     lappend htmlMenuList $htmlOtherMenu
  1383.  
  1384.     # Allow user to insert custom menu items
  1385.     
  1386.     if {$htmlPackageToUse == 1 && [info exists htmlElemKeyBinding]} {
  1387.         foreach elem [lsort [array names htmlElemKeyBinding]] {
  1388.             lappend customMenuList "$htmlElemKeyBinding($elem)[string range $elem 0 0][string tolower [string range $elem 1 end]]"
  1389.         }
  1390.         set htmlCustomMenu [list menu -M HTML -p htmlMenuItem -m -n "Custom" $customMenuList]
  1391.         lappend htmlMenuList $htmlCustomMenu
  1392.     }
  1393.     
  1394.     # Show alert if user uses old way of defining custom elements.
  1395.     if {[info exists htmlCustomMenuList]} {htmlNewElemVar}    
  1396.     
  1397. # Character entities
  1398.     set htmlSmallCharsMenu [list menu -M HTML -p htmlMenuItem -m -n "Small Chars" \
  1399.     [lsort  [array names htmlSpecialCharacter]]]
  1400.     set htmlCapCharsMenu [list menu -M HTML -p htmlMenuItem -m -c -n "Capital Chars" \
  1401.     [lsort [array names htmlCapCharSpecMenu]]]
  1402.     set htmlSymbCharsMenu [list menu -M HTML -p htmlMenuItem -m -n "Other Chars" \
  1403.     [lsort [array names htmlSpecialSymbCharacter]]]    
  1404.     set tmp $commonChars
  1405.     if {[llength $commonChars]} {lappend tmp "(-"}
  1406.     lappend tmp Add Default Clear $htmlSmallCharsMenu $htmlCapCharsMenu $htmlSymbCharsMenu  
  1407.     set htmlCharsMenu [list menu -M HTML -p htmlMenuItem -m -n "Character Entities" $tmp]
  1408.     lappend htmlMenuList $htmlCharsMenu
  1409.  
  1410.  
  1411.  
  1412.     # Put it all together
  1413.     menu -M HTML -m  -p htmlMenuItem -n $htmlMenu $htmlMenuList    
  1414.     insertMenu $htmlMenu
  1415.     # Add some things to translation menu.
  1416.     addMenuItem -m -l "" "Character Translation" "<>& -> HTML"
  1417.     addMenuItem -m -l "" "Character Translation" "HTML -> <>&"
  1418.  
  1419.     # Mark package
  1420.     if {$htmlPackageToUse == 1} {
  1421.         markMenuItem -m {Packages} {Extensions} 1 
  1422.     } else {
  1423.         markMenuItem -m {Packages} {HTML 3.2} 1 
  1424.     }
  1425.     # Disable Extend menu if not cleaned up HTMLAdditions.tcl
  1426.     if {[info exists htmlShownWarning]} {enableMenuItem "HTML Utilities" Extend off}
  1427.     # Disable Use Attrs menu if status bar isn't used.
  1428.     if {$HTMLmodeVars(useBigWindows)} {
  1429.         enableMenuItem $htmlMenu "Use Attributes" off
  1430.     }
  1431.     # Disable URLs and Windows menus if caches are empty.
  1432.     if {![llength $HTMLmodeVars(URLs)]} {htmlEnableURLs off}
  1433.     if {![llength $HTMLmodeVars(windows)]} {htmlEnablewindows off}
  1434.     # Disable some menu items in Extend menu if no additions.
  1435.     if {$htmlPackageToUse == 1} {htmlEnableExtend [info exists htmlElemKeyBinding] $htmlAdditionExist}
  1436.     # Check if Big Brother exists and if it should be used.
  1437.     if {[catch {nameFromAppl Bbth}]} {
  1438.         enableMenuItem "Check Links" "Use Big Brother" off
  1439.         if {$HTMLmodeVars(useBigBrother)} {
  1440.             set HTMLmodeVars(useBigBrother) 0
  1441.             lappend modifiedModeVars {useBigBrother HTMLmodeVars}
  1442.         }
  1443.     } elseif {$HTMLmodeVars(useBigBrother)} {
  1444.         markMenuItem -m {Check Links} {Use Big Brother} 1 
  1445.     }
  1446.     # Add browsers to Browser menu
  1447.     if {[lsearch -exact $HTMLmodeVars(browsers) $browserSig] < 0} {
  1448.         lappend HTMLmodeVars(browsers) $browserSig
  1449.         lappend modifiedModeVars {browsers HTMLmodeVars}
  1450.     }
  1451.     set htmlBrowsers {}
  1452.     set tmpbrws {}
  1453.     foreach brws $HTMLmodeVars(browsers) {
  1454.         if {![catch {nameFromAppl $brws} name]} {
  1455.             set name [file tail $name]
  1456.             lappend htmlBrowsers [list $brws $name]
  1457.             lappend tmpbrws $brws
  1458.             addMenuItem -m "Browsers" $name
  1459.             if {$brws == $browserSig} {markMenuItem -m "Browsers" $name on }
  1460.         } else {
  1461.             lappend modifiedModeVars {browsers HTMLmodeVars}
  1462.         }
  1463.     }
  1464.     set HTMLmodeVars(browsers) $tmpbrws
  1465. }
  1466.  
  1467.  
  1468. #===============================================================================
  1469. # Key Bindings
  1470. #===============================================================================
  1471.  
  1472. proc htmlBindKeys {} {
  1473.     global HTMLmodeVars 
  1474.     
  1475.     catch {deleteModeBindings HTML}
  1476.     
  1477.     # tabs to tabmarks (•)
  1478.     bind '\t'        htmlTabNext    HTML
  1479.     bind '\t'    <s> htmlTabPrev    HTML
  1480.  
  1481.     bind ','    <zso>    {htmlInsertCharacter "less than"} HTML
  1482.     bind '.'    <zso>    {htmlInsertCharacter "greater than"} HTML
  1483.     bind '7'     <zso>    {htmlInsertCharacter ampersand}    HTML
  1484.     bind 0x31      <zso>    {htmlInsertCharacter "nonbreak space"}    HTML
  1485.     
  1486.     # bindings for JavaScript
  1487.     bind '\{' <s> electricLeft        HTML
  1488.     bind '\}' <s> electricRight    HTML
  1489.     
  1490.     # Comment line
  1491.     bind 'l' <C>  htmlDividingLine HTML
  1492. }
  1493.  
  1494. # Unbinding of keys not used in the smaller packages.
  1495. proc htmlUnbindKeys {} {
  1496.     global htmlPackageToUse htmlElemKeyBinding
  1497.     
  1498.     if {$htmlPackageToUse == 3} {
  1499.         unbind 'f' <zso> {} HTML
  1500.         unbind 'o' <zso> {} HTML
  1501.         unbind 'r' <zso> {} HTML
  1502.         unbind 'n' <zso> {} HTML
  1503.         unbind 'e' <zc>  {} HTML
  1504.         unbind 'n' <zc>     {} HTML
  1505.         foreach elem [array names htmlElemKeyBinding] {
  1506.             set keystr $htmlElemKeyBinding($elem)
  1507.             if {[string length $keystr]} {
  1508.                 set key [string tolower [string range $keystr [expr [string length $keystr] - 1] end]]
  1509.                 set mods ""
  1510.                 foreach m [split [string range $keystr 1 [expr [string length $keystr] - 3]] < ] {
  1511.                     if {$m == "B"} {append mods z}
  1512.                     if {$m == "I"} {append mods o}
  1513.                     if {$m == "U"} {append mods s}
  1514.                     if {$m == "O"} {append mods c}
  1515.                 }
  1516.                 catch {unbind '$key' <$mods> {} HTML}
  1517.             }
  1518.         }
  1519.     }
  1520. }
  1521.